package com.yby6.system.service.impl;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import org.springframework.transaction.annotation.Transactional;
import com.yby6.common.exception.CustomException;
import com.yby6.common.core.domain.SysRoleMenu;
import com.yby6.system.mapper.SysRoleMapper;
import com.yby6.common.core.domain.SysRole;
import com.yby6.system.mapper.SysRoleMenuMapper;
import com.yby6.system.service.SysRoleService;

import java.util.ArrayList;
import java.util.List;

/**
 * @author TeouBle
 */
@Service
public class SysRoleServiceImpl implements SysRoleService {

	@Resource
	private SysRoleMapper sysRoleMapper;
	@Resource
	private SysRoleMenuMapper sysRoleMenuMapper;

	/**
	 * 分页获取角色列表
	 *
	 * @param sysRole
	 * @return
	 */
	@Override
	public List<SysRole> list(SysRole sysRole) {
		return this.sysRoleMapper.list(sysRole);
	}

	/**
	 * 新增角色信息
	 *
	 * @param sysRole
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public int add(SysRole sysRole) {
		// 新增角色
		sysRoleMapper.insert(sysRole);
		return insertRoleMenu(sysRole);
	}

	/**
	 * 更新角色信息
	 *
	 * @param sysRole
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public int update(SysRole sysRole) {
		// 更新角色
		sysRoleMapper.updateByPrimaryKey(sysRole);
		// 删除角色与菜单的关联
		sysRoleMenuMapper.deleteRoleMenuByRoleId(new Long[]{sysRole.getRoleId()});
		// 新增角色与菜单的关联
		return insertRoleMenu(sysRole);
	}

	/**
	 * 根据Id批量删除角色信息
	 *
	 * @param ids
	 * @return
	 */
	@Override
	@Transactional(rollbackFor = CustomException.class)
	public int delete(Long[] ids) {
		// 删除角色与菜单关联
		sysRoleMenuMapper.deleteRoleMenuByRoleId(ids);
		return this.sysRoleMapper.deleteByIds(ids);
	}

	/**
	 * 根据ID获取角色信息附带权限
	 *
	 * @param id
	 * @return
	 */
	@Override
	public SysRole getRoleById(Long id) {
		SysRole sysRole = this.sysRoleMapper.selectByPrimaryKey(id);
		// 根据角色ID查询拥有的权限(菜单)不包含父级菜单否则会全部回显
		List<Long> menuList = sysRoleMenuMapper.selectMenuByRoleId(id);
		if (menuList.size() > 0) {
			sysRole.setMenuId(menuList);
		}
		return sysRole;
	}

	/**
	 * 查询全部角色信息(用于下拉菜单树)
	 *
	 * @return
	 */
	@Override
	public List<SysRole> getRoleAll() {
		return this.sysRoleMapper.getRoleAll();
	}

	/**
	 * 根据用户ID获取角色
	 *
	 * @param userId 用户ID
	 * @return 选中角色ID列表
	 */
	@Override
	public List<Integer> selectRoleListByUserId(Long userId) {
		return sysRoleMapper.selectRoleListByUserId(userId);
	}

	/**
	 * 新增角色菜单信息
	 *
	 * @param role 角色对象
	 */
	public int insertRoleMenu(SysRole role) {
		int rows = 1;
		// 关联角色与菜单
		List<SysRoleMenu> sysRoleMenus = new ArrayList<>();
		for (Long aLong : role.getMenuId()) {
			SysRoleMenu sysRoleMenu = new SysRoleMenu();
			sysRoleMenu.setRoleId(role.getRoleId());
			sysRoleMenu.setMenuId(aLong);
			sysRoleMenus.add(sysRoleMenu);
		}

		if (sysRoleMenus.size() > 0) {
			rows = sysRoleMenuMapper.batchInsert(sysRoleMenus);
		}
		return rows;
	}

}
